import BaseController from "../../base/baseController.js";
import ShopCartItemModel from "../model/shopCartItemModel.js";
import GoodsItemController from "./goodsItemController.js";

/**
 * @description 购物车列表控制器
 * @class {ShopCartItemController}
 * @extends {BaseController} 基础控制器
 * @author hhx
 * @date 2024-12-2 11:12
 * @version 0.1.2
 */
export default class ShopCartItemController extends BaseController {

    /**
     * @description 商品列表控制器
     * @private
     * @type {GoodsItemController}
     */
    _goodsItemController = null;

    /**
     * @description 购物车列表控制器
     * @public
     * @constructor
     * @param props {Object} 配置对象
     */
    constructor(props) {
        super(props);
    }

    /**
     * @description 实例化 商品列表
     * @public
     * @static
     * @param props {object} 配置对象
     * @returns {ShopCartNavigationController|*} 商品列表
     */
    static instance(props = {}) {
        const instance = new ShopCartItemController(props);
        instance.init(props);
        return instance;
    }

    //=========================== 内部成员 ===============================

    /**
     * @description 获取 商品列表控制器
     * @property
     * @protected
     * @return {GoodsItemController} 商品列表控制器
     */
    get goodsItemController() {
        return this._goodsItemController;
    }

    /**
     * @description 设置 商品列表控制器
     * @property
     * @protected
     * @param value {GoodsItemController} 商品列表控制器
     */
    set goodsItemController(value) {
        this._goodsItemController = value;
    }

    //=========================== 成员方法 ===============================

    /**
     * @description 获取 商品列表控制器
     * @public
     * @return {GoodsItemController} 商品列表控制器
     */
    getGoodsItemController() {
        return this.goodsItemController;
    }

    /**
     * @description 设置 商品列表控制器
     * @public
     * @param value {GoodsItemController} 商品列表控制器
     */
    setGoodsItemController(value) {
        this.goodsItemController = value;
    }

    /**
     * @description 判断商品列表控制器是否存在
     * @public
     * @return {Boolean} true 是 false 否
     */
    hasGoodsItemController() {
        return this.isNotNull(this.goodsItemController);
    }

    //=========================== 基础属性 ===============================

    //=========================== 属性方法 ===============================

    //=========================== 接口方法 ===============================

    /**
     * @description 添加店铺商品
     * @public
     * @param product {ProductModel} 商品模型
     */
    addProductToShop(product) {
        this.goodsItemController.addProductToShop(product);
    }

    /**
     * @description 获取店铺商品列表
     * @public
     * @return {Array} 商品列表
     */
    getProductToShop() {
        return this.goodsItemController.getProductToShop();
    }

    //=========================== 重载方法 ===============================

    /**
     * @description 重载方法
     * @protected
     * @override
     */
    init(props) {

        super.init(props);

        //初始化模型
        this.initModel();

        //初始化商品列表控制器
        this.initGoodsItemController();
        
    }

    //=========================== 创建方法 ===============================

    /**
     * @description 创建购物车列表模型
     * @protected
     *@returns {ShopCartItemModel} 购物车列表模型
     */
    createModel() {
        return ShopCartItemModel.instance();
    }

    /**
     * @description 创建购物车列表控制器
     * @protected
     *@returns {GoodsItemController} 购物车列表控制器
     */
    createGoodsItemController() {
        return GoodsItemController.instance();
    }

    //=========================== 构建方法 ===============================


    //=========================== 内部方法 ===============================

    /**
     * @description 初始化模型
     * @protected
     */
    initModel() {
        let model = this.createModel();
        this.setModel(model);
    }

    /**
     * @description 初始化商品列表控制器
     * @protected
     */
    initGoodsItemController() {
        let goodsItemController = this.createGoodsItemController();
        this.setGoodsItemController(goodsItemController);
    }

    //=========================== 控制方法 ===============================

    //=========================== 事件订阅 ===============================

    //=========================== 事件触发 ===============================

    //=========================== 处理函数 ===============================
}





